import vnode from "./vnode";

// 目前只接受3种  简化版的 h 函数
/**
 *  1、 h('div',{},'文字')
 *  2、 h('div',{},[
 *         h('div',{},h()),
 *         h('div',{},h()),
 *         h('div',{},h())
 *      ]
 *  3 h('div',{},h())
 * **/
export default function(sel, data, c) {
  // 检查参数个数
  if (arguments.length !== 3) throw new Error("只能传递3个参数");

  // 检查参数 c 的类型
  if (typeof c === "string" || typeof c === "number") {
    // 调用 h 函数 1 类型
    return vnode(sel, data, undefined, c, undefined);
  } else if (Array.isArray(c)) {
    // c 是一个数组 调用 h 函数 2 类型
    // 遍历 c
    for (let i = 0; i < c.length; i++) {
      // c  只能是 h 函数
      if (!isH(c[i])) throw new Error("传入的项不是h函数");
    }
    return vnode(sel, data, c, undefined, undefined);

    // Object.prototype.hasOwnProperty.call(c[i], "sel")  检测 c 是否有这个属性
  } else if (isH(c)) {
    // 调用 h 函数 3 类型
    return vnode(sel, data, [c], undefined, undefined);
  } else {
    throw new Error("传入3个参数类型不对");
  }
}

// 是不是 h 函数
const isH = (h) => {
  if (typeof h === "object" && Object.prototype.hasOwnProperty.call(h, "sel")) {
    return true;
  }
  return false;
};
